perm filename PIXTS5.SAI[VIS,HPM]1 blob sn#147477 filedate 1975-02-25 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "PIXTS5"
C00016 ENDMK
C⊗;
BEGIN "PIXTS5"
REQUIRE "VIXNIC.SAI[VIS,HPM]" SOURCE_FILE;
REQUIRE "WIXNIC.SAI[VIS,HPM]" SOURCE_FILE;
INTEGER SIZE0,W,CAMERA,CHN,WID,HIG,IAV,BIT,NORD,I,J,K,L,M,ILK,MAXF,QUAL,QUALT;
INTEGER ILS,JLS,IHS,JHS,II,JJ,LL,HPFIT;
BOOLEAN SYNA,SAME;
STRING LASTI,FN1,CAMN;
REQUIRE "⊂⊃<>" DELIMITERS;
DEFINE BOX(X1,Y1,X2,Y2)=
⊂	IF SYNA THEN
		BEGIN
		LINE(X1,Y1,X2,Y1);
		LINE(X2,Y1,X2,Y2);
		LINE(X2,Y2,X1,Y2);
		LINE(X1,Y2,X1,Y1);
		END
	ELSE
		BEGIN
		DRKEN;
		RECTAN(X1,Y1,X2,Y2);
		LITEN;
		RECTAN((3*(X1)+X2)/4,(3*(Y1)+Y2)/4,(X1+3*(X2))/4,(Y1+3*(Y2))/4);
		END
⊃;

DEFINE BOX1(X1,Y1,X2,Y2)=
⊂	        BEGIN
                LITEN;
		LINE(X1,Y1,X2,Y1);
		LINE(X2,Y1,X2,Y2);
		LINE(X2,Y2,X1,Y2);
		LINE(X1,Y2,X1,Y1);
		END
⊃;


OUTSTR("CAMERA NUMBER:"); CAMERA←CVD(CAMN←INCHWL) MOD 4;
IF LENGTH(CAMN)=0 THEN CAMERA←-1;
OUTSTR("WINDOW SIZE:"); W←CVD(INCHWL);
OUTSTR("FILTER WINDOW:"); HPFIT←CVD(INCHWL);
OUTSTR("MAX NUMBER OF FEATURES:"); MAXF←CVD(INCHWL);
OUTSTR("DUPLICATE PICTURE?"); SAME←(INCHWL LAND '137)="Y";
OUTSTR("USE SYNTHESIZER?"); SYNA←(INCHWL LAND '137)="Y";
IF CAMERA≥0 THEN
   BEGIN
   WID←HIG←256; BIT←4;
   SIZE0←PIXDIM(HIG,WID,BIT);
   OUTSTR("SIZE= "&CVS(SIZE0)&'15&'12);
   END
ELSE
   BEGIN
   DO
      BEGIN
      OUTSTR("FILE 1:"); FN1←INCHWL;
      SIZE0←PFLDIM(FN1);
      END
   UNTIL SIZE0>0;
      BEGIN
      INTEGER ARRAY T[0:SIZE0-1];
      GETPFL(FN1,T[0]);
      HIG←T[PCLN];
      WID←T[LNBY];
      BIT←T[BYBI];
      END;
   END;
NORD←0; WHILE W≤(WID MIN HIG)%2↑(NORD+1) DO NORD←NORD+1;
OUTSTR("NUMBER OF REDUCTIONS IS "&CVS(NORD)&'15&'12);
ILK←0; WHILE W%2↑(ILK+1)≥2 DO ILK←ILK+1;
OUTSTR("LEVEL FOR INTEREST OPR IS "&CVS(ILK)&'15&'12);

   BEGIN
   INTEGER ARRAY SIZE,PC[0:NORD];

   PC[0]←0; SIZE[0]←SIZE0;
   FOR I←1 STEP 1 UNTIL NORD DO
      BEGIN
      SIZE[I]←PIXDIM(HIG%2↑I,WID%2↑I,(BIT+2*I) MIN 10);
      PC[I]←PC[I-1]+SIZE[I-1];
      OUTSTR("#"&CVS(I)&"  SIZE "&CVS(SIZE[I])&"  PC "&CVS(PC[I])&'15&'12);
      END;

      BEGIN
      INTEGER ARRAY PA,PB[0:PC[NORD]+SIZE[NORD]-1];
      IF CAMERA≥0 THEN
         BEGIN
         MAKPIX(HIG,WID,4,PA[PC[0]]);
         MAKPIX(HIG,WID,4,PB[PC[0]]);
         OUTSTR("READING ");
         CAMPIX(CAMERA,2,2,1,8,PA[PC[0]]);
         IF CAMERA≠0 THEN BEGIN OUTSTR("HO HUM"); INCHWL; END;
         IF ¬SAME THEN CAMPIX(CAMERA,2,2,1,8,PB[PC[0]])
            ELSE COPPIC(PA[PC[0]],PB[PC[0]]);
         OUTSTR("DONE"&'15&'12);
         END
      ELSE
         BEGIN
         BOOLEAN OK;
         GETPFL(FN1,PA[PC[0]]);
         IF ¬SAME THEN
         DO
            BEGIN
            OUTSTR("FILE 2:");
            OK←GETPFL(INCHWL,PB[PC[0]]);
            END
         UNTIL OK
         ELSE COPPIC(PA[PC[0]],PB[PC[0]]);
         END;

      IF HPFIT>0 THEN
         BEGIN
         INTEGER ARRAY T[0:SIZE0-1];
         COPPIC(PA[PC[0]],T[0]);
         PASSHI(T[0],HPFIT,PA[PC[0]]);
         COPPIC(PB[PC[0]],T[0]);
         PASSHI(T[0],HPFIT,PB[PC[0]]);
         END;

      FOR I←1 STEP 1 UNTIL NORD DO
         BEGIN
         HAFPIC(PA[PC[I-1]],PA[PC[I]],10);
         HAFPIC(PB[PC[I-1]],PB[PC[I]],10);
         END;
      
      OUTSTR("WID "&CVS(WID)&" HIG "&CVS(HIG)&'15&'12);
      IF ¬SYNA THEN OUTSTR(CVOS(CHN←GDDCHN(-1))&" IS THE DD CHANNEL"&'15&'12);

      DDINIT; SCREEN(-1,-1,1,1);
      DRKEN; RECTAN(-1,-1,1,1); LITEN;
      FOR I←1 STEP 1 UNTIL (IF SYNA THEN PA[PC[0]+BYBI] MIN 5 ELSE 1) DO
         BEGIN
         DRKEN; RECTAN(-1,-1,1,1);
         FOR M←0 STEP 1 UNTIL NORD DO
            BEGIN
            K←PA[PC[M]+BYBI]-I;
            VIDEO(-(1+2↑(-M))%2,1-2↑(1-M),
               -(1-2↑(-M))%2,1-2↑(-M),PA[PC[M]],IF SYNA THEN 2↑K ELSE -1);
            VIDEO((1+2↑(-M))%2,1-2↑(1-M),
               (1-2↑(-M))%2,1-2↑(-M),PB[PC[M]],IF SYNA THEN 2↑K ELSE -1);
            END;
         FOR J←1,2,3 DO DPYUP(IF SYNA THEN SYNMAP(5-I) ELSE CHN);
         IF ¬SYNA THEN SHOW(CHN) ELSE SHOW('47);
         END;

         BEGIN
         INTEGER ARRAY FEAT[1:2,1:2,0:2,1:MAXF+1];
         INTEGER ARRAY DD1[0:IF SYNA THEN 0 ELSE DDSIZ-1];
         INTEGER NFEAT;
         NFEAT←0;

         IF SYNA THEN BEGIN DRKEN; RECTAN(-1,-1,1,1); LITEN; END;
         IF SYNA THEN FOR J←1,2,3 DO DPYUP(SYNMAP(5));
         IF ¬SYNA THEN DDSTOR(DD1[0]);
            BEGIN
            INTEGER ARRAY INTER[-2:(HIG%2↑ILK-1)%(W%2↑ILK)-1,
                                 0:(WID%2↑ILK-1)%(W%2↑ILK)-1];
            IAV←INTRST(PA[PC[ILK]],W%2↑ILK,INTER[0,0]);
            FOR I←1 STEP 1 UNTIL (HIG%2↑ILK-1)%(W%2↑ILK)-1 DO
            FOR J←1 STEP 1 UNTIL (WID%2↑ILK-1)%(W%2↑ILK)-1 DO
            IF (INTER[I,J] LAND 1)≠1∧INTER[I,J]>IAV%8 THEN
               BEGIN
               NFEAT←(NFEAT MIN MAXF)+1;
               FEAT[1,1,0,NFEAT]←INTER[I,J];
               FEAT[1,1,1,NFEAT]←J*(W%2↑ILK)*2↑ILK;
               FEAT[2,1,1,NFEAT]←J*(W%2↑ILK)*2↑ILK+W;
               FEAT[1,1,2,NFEAT]←I*(W%2↑ILK)*2↑ILK;
               FEAT[2,1,2,NFEAT]←I*(W%2↑ILK)*2↑ILK+W;
               FOR K←1 STEP 1 UNTIL NFEAT-1 DO
                  IF FEAT[1,1,0,NFEAT]>FEAT[1,1,0,K] THEN
                     FOR LL←1,2 DO FOR L←0,1,2 DO FEAT[LL,1,L,NFEAT]↔FEAT[LL,1,L,K];
               END;
            END;
         NFEAT←NFEAT MIN MAXF;
         LASTI←"C";
         FOR L←1 STEP 1 UNTIL NFEAT DO
            BEGIN
            INTEGER IL,JL,IH,JH;
            IF SYNA THEN BEGIN DRKEN; RECTAN(-2,-2,2,2); LITEN; END
               ELSE DDLOAD(DD1[0]);
            FOR K←1 STEP 1 UNTIL L-1 DO
            IF FEAT[1,2,0,K]≤8 THEN
               BEGIN
               BOX(<FEAT[1,1,1,K]/WID-1>,<-FEAT[1,1,2,K]/HIG>,
                   <FEAT[2,1,1,K]/WID-1>,<-FEAT[2,1,2,K]/HIG>);
               BOX(<FEAT[1,2,1,K]/WID>,<-FEAT[1,2,2,K]/HIG>,
                   <FEAT[2,2,1,K]/WID>,<-FEAT[2,2,2,K]/HIG>);
               END;
            J←FEAT[1,1,1,L]; JJ←FEAT[2,1,1,L];
            I←FEAT[1,1,2,L]; II←FEAT[2,1,2,L];
            BOX(<JJ/WID-1>,<-II/HIG>,<J/WID-1>,<-I/HIG>);
            FOR K←1,2,3 DO DPYUP(IF SYNA THEN SYNMAP(5) ELSE CHN);
            IL←0; JL←0;
            IH←HIG%2↑NORD-1; JH←WID%2↑NORD-1;
            QUAL←0;
            FOR M←NORD STEP -1 UNTIL 0 DO
               BEGIN
               INTEGER ILT,JLT,IHT,JHT,D;
               BOX1(<JL*2↑M/WID>,<-IL*2↑M/HIG>,
                  <((JH+1)*2↑M-1)/WID>,<-((IH+1)*2↑M-1)/HIG>);
               BOX1(<(J+W*(1-2↑M)%2)%WID-1>,<-(I+W*(1-2↑M)%2)/HIG>,
                  <(J+W*(1+2↑M)%2)/WID-1>,<-(I+W*(1+2↑M)%2)/HIG>);
               FOR K←1,2,3 DO DPYUP(IF SYNA THEN SYNMAP(5) ELSE CHN);
               D←0;
               DO
                  BEGIN
                  D←D+1;
                  JLT←JL; ILT←IL; JHT←JH; IHT←IH;
                  JLS←(J+JJ)%2↑(M+1)-W%2↑D;
                  ILS←(I+II)%2↑(M+1)-W%2↑D;
                  JHS←(J+JJ)%2↑(M+1)+W%2↑D;
                  IHS←(I+II)%2↑(M+1)+W%2↑D;
                  QUALT←BSTCOR(PA[PC[M]],ILS,JLS,IHS,JHS,
                      PB[PC[M]],ILT,JLT,IHT,JHT);
                  QUALT←QUALT-M;
                  END
               UNTIL QUALT≤8 ∨ W%2↑D<((6-M) MAX 2);
               IL←ILT*2; JL←JLT*2;
               IH←IHT*2+1+((HIG%2↑(M-1)) MOD 2);
               JH←JHT*2+1+((WID%2↑(M-1)) MOD 2);
               QUAL←QUAL MAX QUALT;
               IF QUAL>8 THEN M←0;
               END;
            IL←IL%2; JL←JL%2; IH←IH%2; JH←JH%2;
            FEAT[1,1,1,L]←JLS;
            FEAT[2,1,1,L]←JHS;
            FEAT[1,1,2,L]←ILS;
            FEAT[2,1,2,L]←IHS;
            FEAT[1,2,0,L]←QUAL;
            FEAT[1,2,1,L]←JL;
            FEAT[2,2,1,L]←JH;
            FEAT[1,2,2,L]←IL;
            FEAT[2,2,2,L]←IH;
            BOX(<JL/WID>,<-IL/HIG>,<JH/WID>,<-IH/HIG>);
            FOR K←1,2,3,4 DO DPYUP(IF SYNA THEN SYNMAP(5) ELSE CHN);
            IF (M←INCHRS)>0 THEN LASTI←(M LAND '137);
            IF LASTI≠"C" THEN LASTI←(INCHRW LAND '137);
            END;
         IF SYNA THEN BEGIN DRKEN; RECTAN(-2,-2,2,2); LITEN; END
            ELSE DDLOAD(DD1[0]);
         FOR K←1 STEP 1 UNTIL NFEAT DO
         IF FEAT[1,2,0,K]≤8 THEN
            BEGIN
            BOX(<FEAT[1,1,1,K]/WID-1>,<-FEAT[1,1,2,K]/HIG>,
                <FEAT[2,1,1,K]/WID-1>,<-FEAT[2,1,2,K]/HIG>);
            BOX(<FEAT[1,2,1,K]/WID>,<-FEAT[1,2,2,K]/HIG>,
                <FEAT[2,2,1,K]/WID>,<-FEAT[2,2,2,K]/HIG>);
            END;
         FOR K←1 STEP 1 UNTIL 4 DO DPYUP(IF SYNA THEN SYNMAP(5) ELSE CHN);
         INCHWL;
         IF ¬SYNA THEN RDDCHN(CHN);
         END;
      END;
   END;
END;